Skip to content

feat(helm): add HStore deployment chart - #3132

Draft
bitflicker64 wants to merge 8 commits into
apache:masterfrom
bitflicker64:feat/hstore-helm-chart
Draft

feat(helm): add HStore deployment chart#3132
bitflicker64 wants to merge 8 commits into
apache:masterfrom
bitflicker64:feat/hstore-helm-chart

Conversation

@bitflicker64

@bitflicker64 bitflicker64 commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Purpose of the PR

Add an official Helm installation path for the distributed HugeGraph HStore
topology on Kubernetes. The chart packages the PD, Store, and Server startup
contract that otherwise has to be reconstructed by each operator.

This PR stays a draft until its remaining prerequisite PRs land. The
previously open item under "Known gaps before this leaves draft" (the
auth.admin_pa bootstrap gap) is now fixed and retested; see that section
and the validation update below.

Main Changes

  • Add the first helm/hugegraph chart with chart version 0.1.0:
    • PD and Store StatefulSets with persistent storage and headless Services.
    • Server Deployment and client Service.
    • PD, Store, and optional Server PodDisruptionBudgets.
    • Optional Server HPA and Ingress.
    • A helm test connection hook.
  • Add values.schema.json with render-time validation for replica counts,
    storage, PDBs, HPA, authentication, Services, and other value contracts.
  • Add default 3+3+3, single-node, and production-oriented values presets.
  • Add scheduling controls, per-component ServiceAccounts with token mounting
    disabled by default, configurable pod security contexts, hardened container
    security defaults, graceful termination periods, probes, and extraEnv.
  • Track the latest PD, Store, and Server images while this PR is a draft,
    using pull policy Always so nodes do not retain an older cached image.
  • Add Helm lint, render, invalid-value, kubeconform, legacy-values, and
    packaging CI.
  • Add chart installation, configuration, upgrade, troubleshooting, and
    limitations documentation, plus a root README installation link.
  • Add an optional Hubble UI component: a single-replica Deployment with a
    Recreate strategy, ClusterIP Service, optional Ingress and persistence,
    hubble.mode (pd for PD discovery and the operations view, direct for
    the Server Service only), probes, schema validation, render-time guards,
    documentation, and CI coverage. Current Hubble images authenticate their
    login against the cluster, so rendering Hubble without server.auth fails
    unless explicitly overridden.
  • Fix the auth gap flagged in review: the Server wrapper writes
    auth.admin_pa from the auth Secret alongside usePD and pd.peers, and
    rejects Secret values containing properties-parser metacharacters.
  • Announce a resolvable Server address to PD for discovery clients: PD-meta
    installs (auth enabled, or Hubble in pd mode) write server.urls_to_pd
    (the Server client Service URL) and server.deploy_in_k8s=true, replacing
    the unusable 0.0.0.0:8080 default that PD would otherwise hand to
    clients such as Hubble.
  • The Hubble wrapper writes server.host=0.0.0.0 because current Hubble
    images bind server.host (default localhost) and ignore the legacy
    hubble.host key in the shipped configuration.
  • Harden the CI invalid-value step so every rejection case is enforced
    rather than only the last line, and add positive renders for both Hubble
    modes.
  • Default partition sharding to store-level HA: fresh installs seed PD with
    partition.default-shard-count derived from the Store count (3 when
    store.replicas is at least 3, otherwise 1, matching PD's odd-only
    constraint), replacing the image default of one shard replica per
    partition. The seed applies at first bootstrap only; PD metadata is
    authoritative afterwards, and the resulting initial partition count
    change is documented.
  • Default pd.antiAffinity and store.antiAffinity to preferred so the
    chart schedules on clusters with fewer nodes than replicas;
    values-cluster.yaml keeps required and NOTES warns when PD quorum
    members may co-locate.
  • Rewrite the Disaster Recovery documentation around what current PD builds
    actually do (manual /v1/task/patrolPartitions reconciliation, no
    automatic re-replication), and reject JAVA_OPTIONS in extraEnv for
    pd, store, and server because the start scripts drop the chart-managed
    JAVA_OPTS when it is set.

Distributed startup and recovery contracts

  • The chart creates no init Job and does not use HG_SERVER_SKIP_INIT. It sets
    HG_SERVER_INIT_STORE_ENABLED=false, relying on the dedicated
    init_store.enabled gate from fix(dist): gate init-store on a dedicated init_store.enabled option #3119 (issue InitStore should be able to skip local init in PD/HStore deployments #3118) so concurrent Server
    replicas do not initialize the same distributed backend.
  • Store waits for PD quorum before starting.
  • The chart wrapper ensures usePD=true, pd.peers, server.urls_to_pd,
    and server.deploy_in_k8s on PD-meta installs, and, when authentication
    is enabled, writes auth.admin_pa from the mounted Secret before handing
    control back to the image entrypoint. auth.admin_pa applies only at
    first creation, so it does not rotate an existing cluster's password, and
    it lands in rest-server.properties (mode 600) inside the container.
  • Resource names reserve suffix and StatefulSet ordinal space before
    truncation, keeping names valid and PVC identities stable across scaling.
  • Server startup allows at least 450 seconds for the image's storage wait and
    startup command.

Prerequisites

Three prerequisites have merged since this PR was opened:

PR Required behavior Merged as
#3128 One gRPC stub binding per channel b026a90a
#3129 Store readiness retries across all configured PD peers 8b2932c7
#3105 Bounded port preflight without lsof 09dbc744

Three remain open, and this PR should land after all of them:

PR Required behavior Current head
#3119 Dedicated init_store.enabled gate edf07d0f
#3126 Finite JVM DNS cache TTL, plus startup DNS-policy validation and JDK 24+ security-check handling b40c42fb
#3130 Channel and stub refresh after address changes 198de19e

#3126's finite DNS TTL is required for #3130 to resolve a replacement Store
address. Neither change provides complete address recovery alone.

#3119 has since been narrowed to the init_store.enabled option, its gate, the
env mapping, and the init-flag guard. The Docker entrypoint and auth-bootstrap
work that previously shared its branch is now tracked separately in #3133. That
split does not change what this chart needs from #3119, but it does mean the
entrypoint's PASSWORD and auth.admin_pa handling is a known-imperfect
contract this chart depends on.

Validation baseline and head drift

The runtime matrix below was executed against a composition built from these
exact heads:

PR Head under test Status now
#3105 ee8f5559 superseded by 09dbc744
#3119 3e505a81 superseded by ff1325ac (scope narrowed)
#3126 35e1a240 superseded by 4d0ff03e (scope widened)
#3128 0118e158 merged unchanged at this head
#3129 575a1122 merged at 61407213, one commit further
#3130 26218cb3 superseded by ddeef7a9

Only #3128 merged at exactly the head this chart was validated against. The
results below therefore describe the chart's behavior against a composition
that no longer matches upstream, and are reported as the current evidence
baseline rather than as a claim about today's master.

The auth.admin_pa fix and the Hubble component were validated separately
against a newer composition: master at 1716c774 (which already carries
#3105, #3128, and #3129) merged with #3119 at edf07d0f, #3126 at
b40c42fb, and #3130 at 198de19e (the current heads of all three open
prerequisites at the time of this update). Evidence from that composition:

  • Fresh auth-enabled single-node install with Hubble enabled: all Pods
    Ready with zero restarts and init_store.enabled=false throughout (no
    fail-closed refusal).
  • Server auth: unauthenticated requests and the default admin:pa both get
    401; the Secret credential gets 200.
  • Hubble: the UI serves on 8088; the login fails closed on a wrong password
    and succeeds with the Secret credential in both pd and direct modes;
    an authenticated session reads /graphspaces from the cluster through PD
    discovery; with persistence enabled, the H2 metadata lands on the PVC.
  • A fresh non-auth install with Hubble in pd mode confirmed the PD-meta
    properties are written and discovery reaches the Server; it also showed
    current Hubble images cannot complete their login against an auth-less
    cluster (the server rejects /auth/login with "Unconfigured
    authenticator"), which the chart now surfaces as a render-time guard.
  • Three independent review passes on the new work found two high-severity
    issues (both fixed and re-verified): the CI invalid-value step enforced
    only its last line, and the PD-meta properties were scoped to unrelated
    settings.

The full 3 PD + 3 Store + 3 Server lifecycle matrix rerun is still pending
before this PR leaves draft, as committed below.

Known gaps before this leaves draft

  1. Addressed: the wrapper now writes auth.admin_pa. The gap flagged in
    review (the chart set HG_SERVER_INIT_STORE_ENABLED=false and mounted
    PASSWORD, but never wrote auth.admin_pa, so the Secret was silently
    ignored and, after fix(dist): gate init-store on a dedicated init_store.enabled option #3119, an auth-enabled deployment failed at container
    start) is fixed: the wrapper writes auth.admin_pa from the same Secret
    alongside usePD and pd.peers, rejecting values with
    properties-parser metacharacters. auth.admin_pa applies only at first
    creation, so it does not rotate an existing cluster's password, and it
    lands in a mode-600 file inside the container; both caveats are in the
    chart README.

Before this PR leaves draft I will fetch the current master, rebase the
chart, pin appVersion and all component image tags (including Hubble) to
the next release, switch their pull policies to IfNotPresent, verify the
merged prerequisite behavior, rerun the affected full lifecycle matrix
against a composition of the then-current heads, and re-review any
resulting changes.

Verifying these changes

  • Trivial rework / code cleanup without any test coverage. (No Need)
  • Already covered by existing tests, such as (please modify tests here).
  • Need tests and can be verified as follows:
    • Static chart validation: PASS=239 FAIL=0 SKIP=0.
    • Edge-case and hardening suite: PASS=37 FAIL=0.
    • Faithful legacy --reuse-values: helm template and
      helm install --dry-run=client passed.
    • Fresh 3+3+3 install: 9 Ready Pods, zero restarts, cluster 61/0, dataset
      30/0.
    • Same-package upgrade: cluster 61/0, dataset 30/0.
    • Server replacement: PASS=91 FAIL=0.
    • Store replacement: PASS=90 FAIL=0 with data preserved.
    • Deterministic PD REST failover: PASS=7 FAIL=0, with restoration verified.
    • Final cluster and dataset gates: 61/0 and 30/0.
    • Independent review passes 6, 7, and 8 reported no unresolved actionable
      findings on the final template and schema implementation.
    • The subsequent chart-version and default-image metadata amendment changed
      no templates or schema and repeated the full static gate at 239/0/0.

The runtime matrix used a four-node Kubernetes cluster and images built from a
composition containing the exact prerequisite heads listed under "Validation
baseline and head drift". Test-only validation harnesses and lab-specific
low-memory values are excluded from this PR. As noted above, five of those six
heads have since moved, so this matrix will be rerun before the PR is marked
ready.

Does this PR potentially affect the following parts?

Documentation Status

  • Doc - TODO
  • Doc - Done
  • Doc - No Need

Documented operational limits

  • While this PR is a draft, appVersion and all three component image tags are
    latest. This is intentionally temporary and is not the stable publication
    configuration; the next release tag will be pinned before the PR is marked
    ready.
  • Default values intentionally leave resource requests and limits unset;
    values-cluster.yaml is a production starting point, not a capacity
    guarantee.
  • PD and Store anti-affinity defaults to preferred, so the chart schedules
    on any node count; production should pin required (as
    values-cluster.yaml does) so one node failure cannot take out the PD
    quorum or co-locate shard replicas.
  • Authentication is optional and disabled by default. The admin password is
    applied from the Secret only at first creation; the chart cannot rotate an
    existing cluster's admin password.
  • Hubble is optional and disabled by default: single replica, plain HTTP,
    and its login requires server.auth on current images (the chart refuses
    to render it without auth unless explicitly overridden). Its UI connection
    metadata, including graph credentials entered in the UI, lives in an
    embedded H2 database that persists only when hubble.persistence is
    enabled; the PVC is kept on uninstall.
  • The published images run as root. The chart hardens the container without
    setting runAsNonRoot or readOnlyRootFilesystem, which the current image
    contract cannot support.
  • The entrypoint's property handling for mounted and upgraded configs is
    tracked in [Bug] Docker entrypoint auth bootstrap is unsafe for mounted and upgraded configs #3133 and is outside this chart's control.
  • TLS, backup and restore, an Operator, multi-cluster orchestration, automatic
    leader transfer, ConfigMap-based component configuration, and a complete
    monitoring stack are outside this PR.
  • Automatic partition leader rebalancing after Store restarts is upstream
    work, tracked in #3135;
    the chart documents the manual balance endpoints as the current workaround.
  • Shard recovery observability (sync progress, raft lag metrics) is upstream
    work, tracked in #3136.
  • The propagation window after CreateGraph (new graphs not immediately
    available on every Server replica) is documented as a chart limitation;
    the underlying fix is upstream work, tracked in
    #3137.
  • Update: the first server-side fix from that roadmap (the creating server
    waits for its own graph binding before returning 200) is up in
    #3138; the documented
    chart-side mitigations remain useful until the rest of it lands.

@bitflicker64

Copy link
Copy Markdown
Contributor Author

Ordering note: this chart depends on #3119 and should land after it.

server-deployment.yaml injects HG_SERVER_INIT_STORE_ENABLED=false, and the mapping from that env var onto init_store.enabled only exists once #3119 merges. If this merges first, the chart ships pointing at a variable the image does not understand, and the server runs init-store on every pod start while the chart's README says it does not.

No file overlap between the two, so there is nothing to rebase — it is purely a merge-order dependency.

@bitflicker64

bitflicker64 commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Blocking, and it comes from a change in #3119 rather than from this PR's own code.

What changed. With init_store.enabled=false, the built-in authenticator's admin is created on the PD startup path from auth.admin_pa, whose default is the public value pa — while Docker PASSWORD is discarded, since init-store reads it from stdin and the disabled path returns first. init-store now fails closed unless an explicit non-empty auth.admin_pa is configured.

What breaks here. This chart sets HG_SERVER_INIT_STORE_ENABLED=false and supplies PASSWORD from server.auth.existingSecret, but its wrapper writes only usePD and pd.peers — never auth.admin_pa. Once #3119 merges, an auth-enabled deployment fails at container start with Refusing to skip init-store: ... no explicit non-empty 'auth.admin_pa' is configured.

Before that change it did not fail — it came up as admin/pa, silently ignoring the Secret. So this is an existing bug here that #3119 makes visible.

What to do. The wrapper should write auth.admin_pa from the Secret it already mounts as PASSWORD, alongside the usePD and pd.peers lines. That also makes this README line true for the first time:

The image entrypoint keeps ownership of PASSWORD handling and auth.admin_pa.

Two notes while you are in there: auth.admin_pa applies only at first creation, so it will not rotate an existing cluster's password, and it lands in a file inside the container. Merge order is unchanged — this still lands after #3119.

@imbajin imbajin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking: yes. In addition to the documented auth.admin_pa gap, the current chart does not actually gate Store startup or rolling progress on PD quorum and permits disruption budgets below the PD majority. Three independent current-head review lanes converged on these findings.

until [ "$(
ok=0
for peer in ${HEALTH_PEERS}; do
if curl -fsS "http://${peer}/v1/health" >/dev/null 2>&1; then

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

‼️ This counts responding PD processes, not a PD quorum: the current /v1/health handler returns success unconditionally and does not check for a Raft leader or member catch-up. Two REST endpoints can therefore release every Store while PD has no usable quorum; the PD/Store readiness probes use the same process-liveness signal, so a StatefulSet rolling update can also advance before the restarted member has rejoined safely. Please gate on an actual leader/quorum/catch-up-aware signal (for example, validated membership state) and add no-leader plus rolling-restart scenarios.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed on both counts: /v1/health is process liveness, not quorum, and the probes share the same weakness during rolling updates. The fix I intend is to gate the Store init container and the PD readiness signal on /v1/members (leader present, member state validated) rather than counting healthy responders, and to add the no-leader and PD rolling-restart scenarios you list to the full lifecycle matrix rerun already committed before this PR leaves draft. Landing it together with that rerun keeps the gating change and its runtime evidence in one reviewable step rather than shipping an untested probe contract now.

templates require replicas > 1, so a single-replica release never creates one
and must not be failed for a value that has no effect.
*/}}
{{- if and .Values.pd.pdb.enabled (gt (int .Values.pd.replicas) 1) (ge (int .Values.pd.pdb.minAvailable) (int .Values.pd.replicas)) -}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

‼️ This only rejects a PDB that blocks every disruption; it still accepts a budget below the PD Raft majority. For example, pd.replicas=5 with minAvailable=2 renders successfully and permits three voluntary evictions, leaving 2/5 members and no quorum. When the PD PDB is enabled, require minAvailable >= floor(replicas / 2) + 1 (and define the supported even/odd replica contract), with boundary render tests for several replica counts.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in ad52e70. When the PD PDB is enabled, render now requires minAvailable >= floor(replicas/2) + 1 in addition to the existing minAvailable < replicas bound, so pd.replicas=5 with minAvailable=2 is rejected. Boundary cases are in the CI invalid-value step: 5/2 and 4/2 fail, 5/3, 5/4, and 3/2 render. The even/odd contract is documented in the README: with 2 replicas the majority is the whole membership, so no valid budget exists and the PDB must be disabled or the replica count made odd.

value: {{ include "hugegraph.store.restPrimary" . | quote }}
- name: HG_SERVER_INIT_STORE_ENABLED
value: {{ .Values.server.initStoreEnabled | quote }}
{{- with .Values.server.extraEnv }}{{ toYaml . | nindent 12 }}{{- end }}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ extraEnv is appended after chart-owned variables, while the schema allows duplicate names. A user can therefore add another HG_SERVER_INIT_STORE_ENABLED=true and bypass the chart's validated false contract, re-enabling concurrent init-store across Server replicas; the PD and Store templates expose the same override path for their identity/topology variables. Please reject chart-reserved names in each component's extraEnv (or render managed variables last with an explicit precedence contract) and add negative render tests.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in ad52e70. Each component's extraEnv now rejects its chart-managed variable names at render time (hugegraph.validateValues), covering the Server contract variables including HG_SERVER_INIT_STORE_ENABLED and PASSWORD, the PD and Store identity and topology variables, the Hubble wiring variables, and JAVA_OPTS. Rejection was chosen over reordering because rendering managed variables last would silently ignore the user's entry instead of failing it. Negative render cases for Server, PD, and Store overrides are in the CI invalid-value step, and a non-reserved name still renders.

…tore disabled

The Server wrapper now writes auth.admin_pa from the auth Secret alongside
usePD and pd.peers, so an auth-enabled release keeps its configured admin
password with init_store.enabled=false instead of silently falling back to
the public default. The Secret value is rejected when it contains
properties-parser metacharacters that would inject config lines or store a
different password than the Secret holds.

The new hubble component deploys the Hubble UI as a single-replica
Deployment with pd and direct wiring modes, optional Ingress and H2
persistence, schema validation, render-time guards, docs, and CI coverage.
PD-meta installs (auth enabled, or Hubble in pd mode) also announce the
Server client Service URL to PD via server.urls_to_pd and
server.deploy_in_k8s so discovery clients receive a resolvable address
instead of the 0.0.0.0 default, and the Hubble wrapper writes server.host
so current images bind all interfaces. Because current Hubble images
authenticate their login against the cluster, rendering Hubble without
server.auth fails unless explicitly overridden.

The CI invalid-value step now fails on every case rather than only its
last line, and positive renders cover both Hubble modes.

Validated against a composition of master 1716c77 plus the current heads
of apache#3119 (edf07d0), apache#3126 (b40c42f), and apache#3130 (198de19): fresh
auth-enabled installs reach Ready with zero restarts, the admin credential
comes from the Secret while unauthenticated and default-password requests
get 401, and Hubble logs in with the Secret credential and reads cluster
metadata through PD discovery, with its H2 metadata persisted on the PVC.
@bitflicker64

Copy link
Copy Markdown
Contributor Author

Addressed in 34234e3. The wrapper now writes auth.admin_pa from the Secret it already mounts as PASSWORD, alongside usePD and pd.peers, rejecting values with properties-parser metacharacters (newline, CR, backslash, leading whitespace). Verified against a composition of current master plus #3119/#3126/#3130: an auth-enabled install starts cleanly with init-store disabled, unauthenticated requests and the default admin:pa both get 401, and the Secret credential authenticates end to end, including through the new Hubble login. Both caveats are documented in the chart README: auth.admin_pa applies only at first creation, so the Secret cannot rotate an existing cluster's password, and the value lands in rest-server.properties (mode 600) inside the container.

…xtraEnv overrides

A PD PodDisruptionBudget with minAvailable below floor(replicas/2)+1
permits voluntary evictions that leave PD without a Raft majority, so the
render now requires the quorum floor in addition to the existing
blocks-all-drains upper bound. With 2 replicas no valid budget exists;
the README documents the even/odd contract.

extraEnv entries render after the chart-owned variables and Kubernetes
lets the last duplicate win, so a duplicate name could silently override
a validated contract such as HG_SERVER_INIT_STORE_ENABLED=false. Each
component's extraEnv now rejects its chart-managed variable names.

Boundary and negative render cases for both rules are part of the CI
invalid-value step.
@codecov

codecov Bot commented Aug 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 1.54%. Comparing base (b9710a7) to head (ad52e70).
⚠️ Report is 3 commits behind head on master.

❗ There is a different number of reports uploaded between BASE (b9710a7) and HEAD (ad52e70). Click for more details.

HEAD has 2 uploads less than BASE
Flag BASE (b9710a7) HEAD (ad52e70)
3 1
Additional details and impacted files
@@             Coverage Diff              @@
##             master   #3132       +/-   ##
============================================
- Coverage     39.19%   1.54%   -37.65%     
+ Complexity      264      21      -243     
============================================
  Files           770     748       -22     
  Lines         65779   63264     -2515     
  Branches       8726    8278      -448     
============================================
- Hits          25779     975    -24804     
- Misses        37247   62205    +24958     
+ Partials       2753      84     -2669     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

The run failed at startup because azure/setup-helm@v4 is not on the
ASF-approved actions allowlist; install the pinned helm release from
the official tarball in a plain run step instead.
…cheduling defaults

Fresh installs now seed PD with partition.default-shard-count derived from
the Store count (3 when store.replicas is at least 3, otherwise 1, matching
PD's odd-only constraint and its 2-to-1 clamp), so a default 3-Store
deployment gets store-level HA instead of the image default of one shard
replica per partition. The seed is delivered as -D system properties
prepended into the PD JAVA_OPTS ahead of pd.javaOpts, preserving the start
script's automatic heap sizing; it applies at first bootstrap only, after
which PD metadata is authoritative, all documented together with the
resulting initial partition count change.

pd.antiAffinity and store.antiAffinity default to preferred so the chart
schedules on clusters with fewer nodes than replicas; values-cluster.yaml
keeps required for both, NOTES warns when PD quorum members may co-locate,
and the README documents the upgrade implications.

The Disaster Recovery documentation describes what current PD builds
actually do: the scheduled patrol only marks silent stores Offline, shard
reconciliation and tombstone processing run only via the manual
/v1/task/patrolPartitions endpoint, and the pd.patrol-interval and
store.max-down-time properties are bound but never read, which is why the
chart does not expose them. Periodic leader balancing and recovery metrics
are referenced as upstream feature requests.

extraEnv now also rejects JAVA_OPTIONS for pd, store, and server, because
the start scripts drop the chart-managed JAVA_OPTS entirely when it is set.
Schema accepts numeric strings for the new keys, values-file integers at or
above one million no longer fail as scientific notation, and CI asserts the
rendered -D content, covers both shard-count validation messages, and
kubeconforms the sharded render.
@bitflicker64

Copy link
Copy Markdown
Contributor Author

0ebd2dc addresses the deployment-side feedback from testing:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Add an official Helm chart for distributed HStore deployment

2 participants